const repl = require("repl")
const $console = require("Console")
const project = require("./project.js")
const code = require("./code.js")
let actions = {}

actions = Object.assign(actions, project, code)
const getLen = function(value) {
  let lengthSelf = 0
  for (let i = 0, j = value.length; i < j; i++) {
    if (value.charCodeAt(i) < 27 || value.charCodeAt(i) > 126) lengthSelf +=
      2
    else lengthSelf++
  }
  return lengthSelf
}
const infos = []
for (let type in actions) {
  let length = 0
  const lens = []
  const commands = []
  for (let action of actions[type].avs) {
    const thisLen = getLen(`${action.action}`)
    if (thisLen > length) {
      length = thisLen
    }
    lens.push(thisLen)
  }
  let index = 0
  for (let action of actions[type].avs) {
    commands.push(
      `${action.action}${Array(length - lens[index])
        .fill("-")
        .join("")}-->${action.help}`
    )
    index++
  }
  lens.length = 0
  length = 0
  for (let command of commands) {
    const thisLen = getLen(command)
    if (thisLen > length) {
      length = thisLen
    }
    lens.push(thisLen)
  }

  index = 0
  const typeLength = Math.floor(
    (length + 2 - getLen(`${actions[type].name}`)) / 2
  )
  const titleFill = Array(typeLength)
    .fill("-")
    .join("")
  infos.push(`${titleFill}${actions[type].name}${titleFill}`)
  for (let command of commands) {
    infos.push(
      `|.${command}${Array(length - lens[index])
        .fill(" ")
        .join("")}|`
    )
    index++
  }
  infos.push(`${titleFill}${actions[type].name}${titleFill}`)

  infos.push("")
}

$console.warn(
  `
客来啦vue项目【打包】辅助
输入【.help】可以获取命令概述
必须安装[yarn]+[del-cli],请百度
功能：
1: 打包
  1.1 支持生产、测试环境，vue、java项目都可以自动按日期备份，
      java需要手动解压、停止、启动，vue自动部署无需干预
  1.2 打包完成后,可以在电脑上访问移动端主页,
      请在微信中访问的提示页面中会显示打包时间
      另外， 移动端在请求后台接口时， 会将package.json的版本号写入header
      可通过CDN命令集刷新移动端CDN缓存，这样用户可以直接访问CDN
      注意：fetch效率最高，但每天只有100次机会,ref-mh效率低，但机会无限
      ref-m、ref-a一般在CDN中文件错误后才需要使用
2：安装
  2.1 移动端项目的依赖安装不需要通过此工具执行
  2.2 PC端安装依赖时，需要通过 .add xx;
      或者直接修改package.json执行.install;
      在更新到别人提交的package时，也这么操作
3：代码生成
  3.1 生成后台代码(包含java实体类、service、sql文件、PC vue)
      生成前台代码，只有service
  3.2 生成组件
  3.3 生成活动前台代码(*)
  3.4 生成活动后台代码(*)
`
)
const replServer = repl.start({
  prompt: "- "
})
for (let type in actions) {
  for (let action of actions[type].avs) {
    replServer.defineCommand(action.action, action.fn)
  }
}
replServer.defineCommand("help", {
  help: "【帮助】",
  action() {
    for (let info of infos) {
      $console.warn(info)
    }
  }
})